/*
 * MovingObject.h
 *
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses 
 */

#ifndef MOVINGOBJECT_H_
#define MOVINGOBJECT_H_

#include "MovementStrategy.h"
#include "Map.h"
#include "LivingObject.h"

// Clase base de los objetos móviles

class MovingObject: public LivingObject {
protected:
    int speed;
    int last_x;
    int last_y;
    MovementStrategy* mov_strategy;
    int direction;
    int tics_since_moved;

public:
    MovingObject(int x, int y);
    MovingObject(int id, int x, int y);
    int getLastX();
    int getLastY();
    int getDirection();
    void setDirection(int direction);
    // La acción de "vivir" de los objetos móviles es moverse
    virtual void live(Map& map);
    // Si puede moverse, efectúa el movimiento
    // Notifica OBJECT_MOVED
    virtual void move(Map& map);
    bool nextMoveIsInvalid(Map& map);
    // Cambia la dirección a la contraria a la actual
    void turnAround();
    // Efectúa el movimiento, insertando el objeto en el mapa. Si el objeto no
    // puede insertarse, lo vuelve a colocar en la posición anterior
    virtual void advance(Map& map);
    // Invierte las posiciones actual y anterior, y cambia la dirección según
    // corresponda al nuevo estado del objeto
    virtual void revertMove(Map& map);
    virtual ~MovingObject();
    int getNextX();
    int getNextY();
private:
    void init();
};

#endif /* MOVINGOBJECT_H_ */
